package com.example.myapplicationthirteen.receivers;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * 有序广播接收器 - 按【传播方式】分类的广播实现
 * 
 * 核心特性：
 * 1. 同步执行：按优先级顺序依次执行，高优先级先执行
 * 2. 可截断：优先级高的接收器可以终止广播传递
 * 3. 数据传递修改：接收器可以修改结果数据，传递给后续接收器
 * 4. 结果返回：最终可获取广播处理结果
 * 
 * 适用场景：
 * - 权限验证链：多层级的权限或数据验证
 * - 数据加工流水线：数据需要被多步骤处理和增强
 * - 优先级处理：重要操作优先执行，且可能需要终止流程
 * - 需要处理结果：需要获取广播处理的最终结果
 */
public class OrderedBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "OrderedBroadcastReceiver";
    private final String receiverName;
    private final boolean shouldAbort;
    private final boolean shouldModifyData;
    private OnOrderedBroadcastReceivedListener listener;

    /**
     * 有序广播接收监听器接口
     */
    public interface OnOrderedBroadcastReceivedListener {
        /**
         * 广播接收回调
         * @param receiverName 接收器名称
         * @param action 广播动作
         * @param data 广播数据
         * @param resultCode 结果码
         * @param resultData 结果数据
         * @return true表示截断广播，false表示继续传递
         */
        boolean onBroadcastReceived(String receiverName, String action, String data, 
                                   int resultCode, String resultData);
    }

    /**
     * 构造函数
     * @param name 接收器名称
     * @param shouldAbort 是否截断广播
     * @param shouldModifyData 是否修改数据
     */
    public OrderedBroadcastReceiver(String name, boolean shouldAbort, boolean shouldModifyData) {
        this.receiverName = name;
        this.shouldAbort = shouldAbort;
        this.shouldModifyData = shouldModifyData;
    }

    /**
     * 设置有序广播接收监听器
     * @param listener 监听器实例
     */
    public void setOnOrderedBroadcastReceivedListener(OnOrderedBroadcastReceivedListener listener) {
        this.listener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            // 验证intent不为空
            if (intent == null) {
                Log.e(TAG, receiverName + " 收到空有序广播");
                return;
            }

            // 获取广播Action和数据
            String action = intent.getAction();
            String data = intent.getStringExtra("data");
            
            // 获取当前接收器的优先级和结果信息
            int currentResultCode = getResultCode();
            String currentResultData = getResultData();
            Bundle currentExtras = getResultExtras(false); // 不强制创建

            // 详细日志记录
            Log.d(TAG, receiverName + " 收到有序广播: Action=" + action 
                    + ", 数据=" + data
                    + ", 结果码=" + currentResultCode
                    + ", 结果数据=" + currentResultData);

            // 检查是否需要修改数据
            if (shouldModifyData) {
                // 获取可修改的结果Extras
                Bundle results = getResultExtras(true);
                String modifiedData = receiverName + " 修改了数据: " + data;
                results.putString("modified_data", modifiedData);
                
                // 也可以修改结果码和结果数据
                setResultCode(100);
                setResultData(modifiedData);
                
                Log.d(TAG, receiverName + " 修改了广播数据: " + modifiedData);
            }

            // 调用监听器处理，并根据返回值决定是否截断
            boolean listenerAbort = false;
            if (listener != null) {
                listenerAbort = listener.onBroadcastReceived(
                        receiverName, action, data, currentResultCode, currentResultData);
            }

            // 演示截断广播（根据构造参数或监听器返回值）
            boolean finalAbort = shouldAbort || listenerAbort;
            if (finalAbort) {
                Log.d(TAG, receiverName + " 截断了广播，后续接收器将无法收到");
                abortBroadcast(); // 截断广播，后续优先级较低的接收器将无法收到
            }

        } catch (Exception e) {
            // 异常捕获，防止接收器崩溃导致应用问题
            Log.e(TAG, receiverName + " 处理有序广播时发生错误: " + e.getMessage(), e);
            // 即使发生异常，也不要影响后续广播的处理
        }
    }
}